home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / src / net / bind-contrib.tar.gz / bind-contrib.tar / contrib / old / nstest.c < prev   
C/C++ Source or Header  |  1996-10-25  |  12KB  |  427 lines

  1. /*
  2.  * ++Copyright++ 1986
  3.  * -
  4.  * Copyright (c) 1986
  5.  *    The Regents of the University of California.  All rights reserved.
  6.  * 
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 2. Redistributions in binary form must reproduce the above copyright
  13.  *    notice, this list of conditions and the following disclaimer in the
  14.  *    documentation and/or other materials provided with the distribution.
  15.  * 3. All advertising materials mentioning features or use of this software
  16.  *    must display the following acknowledgement:
  17.  *     This product includes software developed by the University of
  18.  *     California, Berkeley and its contributors.
  19.  * 4. Neither the name of the University nor the names of its contributors
  20.  *    may be used to endorse or promote products derived from this software
  21.  *    without specific prior written permission.
  22.  * 
  23.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  24.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  25.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  26.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  27.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  28.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  29.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  30.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  31.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  32.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  33.  * SUCH DAMAGE.
  34.  * -
  35.  * Portions Copyright (c) 1993 by Digital Equipment Corporation.
  36.  * 
  37.  * Permission to use, copy, modify, and distribute this software for any
  38.  * purpose with or without fee is hereby granted, provided that the above
  39.  * copyright notice and this permission notice appear in all copies, and that
  40.  * the name of Digital Equipment Corporation not be used in advertising or
  41.  * publicity pertaining to distribution of the document or software without
  42.  * specific, written prior permission.
  43.  * 
  44.  * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
  45.  * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
  46.  * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
  47.  * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  48.  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  49.  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
  50.  * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  51.  * SOFTWARE.
  52.  * -
  53.  * --Copyright--
  54.  */
  55.  
  56. #ifndef lint
  57. char copyright[] =
  58. "@(#) Copyright (c) 1986 Regents of the University of California.\n\
  59.  portions Copyright (c) 1993 Digital Equipment Corporation\n\
  60.  All rights reserved.\n";
  61. #endif /* not lint */
  62.  
  63. #ifndef lint
  64. static char sccsid[] = "@(#)nstest.c    4.15 (Berkeley) 3/21/91";
  65. static char rcsid[] = "$Id: nstest.c,v 8.1 1996/10/25 04:57:51 vixie Exp $";
  66. #endif /* not lint */
  67.  
  68. #include <sys/param.h>
  69. #include <sys/socket.h>
  70. #include <netinet/in.h>
  71. #include <arpa/inet.h>
  72. #include <arpa/nameser.h>
  73. #include <stdio.h>
  74. #include <resolv.h>
  75. #include "../conf/portability.h"
  76.  
  77. char *progname;
  78. FILE *log;
  79. #define MAXDATA        256   /* really should get this from named/db.h */
  80. main(argc, argv)
  81.     char **argv;
  82. {
  83.     register char *cp;
  84.     register u_char *ucp;
  85.     struct hostent *hp;
  86.     u_short port = htons(NAMESERVER_PORT);
  87.     char buf[BUFSIZ];
  88.     u_char packet[PACKETSZ], answer[8*1024], OldRRData[MAXDATA];
  89.     struct rrec NewRR;
  90.     u_int32_t l;
  91.     int n, dump_packet;
  92.  
  93.     NewRR.r_data = (char *) malloc(MAXDATA);
  94.     NewRR.r_data = (char *) malloc(MAXDATA);
  95.     progname = argv[0];
  96.     dump_packet = 0;
  97.     _res.options |= RES_DEBUG|RES_RECURSE;
  98.     (void) res_init();
  99.     while (argc > 1 && argv[1][0] == '-') {
  100.         argc--;
  101.         cp = *++argv;
  102.         while (*++cp)
  103.             switch (*cp) {
  104.             case 'p':
  105.                 if (--argc <= 0)
  106.                     usage();
  107.                 port = htons(atoi(*++argv));
  108.                 break;
  109.  
  110.             case 'i':
  111.                 _res.options |= RES_IGNTC;
  112.                 break;
  113.  
  114.             case 'v':
  115.                 _res.options |= RES_USEVC|RES_STAYOPEN;
  116.                 break;
  117.  
  118.             case 'r':
  119.                 _res.options &= ~RES_RECURSE;
  120.                 break;
  121.  
  122.             case 'd':
  123.                 dump_packet++;
  124.                 break;
  125.  
  126.             default:
  127.                 usage();
  128.             }
  129.     }
  130.     _res.nsaddr.sin_family = AF_INET;
  131.     _res.nsaddr.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
  132.     _res.nsaddr.sin_port = port;
  133.      if (argc > 1) {
  134.         if (!inet_aton(argv[1],
  135.                    (struct in_addr *)&_res.nsaddr.sin_addr))
  136.             usage();
  137.     }
  138.      if (argc > 2) {
  139.          log = fopen(argv[2],"w");
  140.          if (log == NULL) perror(argv[2]);
  141.      }
  142.     for (;;) {
  143.         printf("> ");
  144.         fflush(stdout);
  145.         if ((cp = fgets(buf, sizeof buf, stdin)) == NULL)
  146.             break;
  147.         if (buf[strlen(buf)-1] == '\n')
  148.             buf[strlen(buf)-1] = '\0';
  149.         switch (*cp++) {
  150.         case 'a':
  151.             n = res_mkquery(QUERY, cp, C_IN, T_A, NULL, 0,
  152.                     NULL, packet, sizeof packet);
  153.             break;
  154.  
  155.         case 'A':
  156.             n = ntohl(inet_addr(cp));
  157.             putlong((u_int32_t)n, (u_char*)cp);
  158.             n = res_mkquery(IQUERY, "", C_IN, T_A, (u_char *)cp,
  159.                     INT32SZ, NULL,
  160.                     packet, sizeof(packet));
  161.             break;
  162.  
  163.         case 'f':
  164.             n = res_mkquery(QUERY, cp, C_ANY, T_UINFO, NULL,
  165.                     0, NULL, packet, sizeof packet);
  166.             break;
  167.  
  168.         case 'F':
  169.             n = res_mkquery(QUERY, cp, C_IN, T_AFSDB, NULL, 0,
  170.                     NULL, packet, sizeof packet);
  171.             break;
  172.  
  173.         case 'g':
  174.             n = res_mkquery(QUERY, cp, C_ANY, T_GID, NULL, 0,
  175.                     NULL, packet, sizeof packet);
  176.             break;
  177.  
  178.         case 'G':
  179.             *(int *)cp = htonl(atoi(cp));
  180.             n = res_mkquery(IQUERY, "", C_ANY, T_GID, (u_char *)cp,
  181.                     sizeof(int), NULL, packet, sizeof packet);
  182.             break;
  183.  
  184.         case 'c':
  185.             n = res_mkquery(QUERY, cp, C_IN, T_CNAME, NULL, 0,
  186.                     NULL, packet, sizeof packet);
  187.             break;
  188.  
  189.         case 'h':
  190.             n = res_mkquery(QUERY, cp, C_IN, T_HINFO, NULL, 0,
  191.                     NULL, packet, sizeof packet);
  192.             break;
  193.  
  194.         case 'm':
  195.             n = res_mkquery(QUERY, cp, C_IN, T_MX, NULL, 0,
  196.                     NULL, packet, sizeof packet);
  197.             break;
  198.  
  199.         case 'M':
  200.             n = res_mkquery(QUERY, cp, C_IN, T_MAILB, NULL, 0,
  201.                     NULL, packet, sizeof packet);
  202.             break;
  203.  
  204.         case 'n':
  205.             n = res_mkquery(QUERY, cp, C_IN, T_NS, NULL, 0,
  206.                     NULL, packet, sizeof packet);
  207.             break;
  208.  
  209.         case 'p':
  210.             n = res_mkquery(QUERY, cp, C_IN, T_PTR, NULL, 0,
  211.                     NULL, packet, sizeof packet);
  212.             break;
  213.  
  214.         case 's':
  215.             n = res_mkquery(QUERY, cp, C_IN, T_SOA, NULL, 0,
  216.                     NULL, packet, sizeof packet);
  217.             break;
  218.  
  219.         case 'T':
  220.             n = res_mkquery(QUERY, cp, C_IN, T_TXT, NULL, 0,
  221.                     NULL, packet, sizeof packet);
  222.             break;
  223.  
  224.         case 'u':
  225.             n = res_mkquery(QUERY, cp, C_ANY, T_UID, NULL, 0,
  226.                     NULL, packet, sizeof packet);
  227.             break;
  228.  
  229.         case 'U':
  230.             *(int *)cp = htonl(atoi(cp));
  231.             n = res_mkquery(IQUERY, "", C_ANY, T_UID, (u_char *)cp,
  232.                     sizeof(int), NULL,
  233.                     packet, sizeof packet);
  234.             break;
  235.  
  236.         case 'x':
  237.             n = res_mkquery(QUERY, cp, C_IN, T_AXFR, NULL, 0,
  238.                     NULL, packet, sizeof packet);
  239.             break;
  240.  
  241.         case 'w':
  242.             n = res_mkquery(QUERY, cp, C_IN, T_WKS, NULL, 0,
  243.                     NULL, packet, sizeof packet);
  244.             break;
  245.  
  246.         case 'b':
  247.             n = res_mkquery(QUERY, cp, C_IN, T_MB, NULL, 0,
  248.                     NULL, packet, sizeof packet);
  249.             break;
  250.  
  251.         case 'B':
  252.             n = res_mkquery(QUERY, cp, C_IN, T_MG, NULL, 0,
  253.                     NULL, packet, sizeof packet);
  254.             break;
  255.  
  256.         case 'i':
  257.             n = res_mkquery(QUERY, cp, C_IN, T_MINFO, NULL, 0,
  258.                     NULL, packet, sizeof packet);
  259.             break;
  260.  
  261.         case 'r':
  262.             n = res_mkquery(QUERY, cp, C_IN, T_MR, NULL, 0,
  263.                     NULL, packet, sizeof packet);
  264.             break;
  265.  
  266.         case '*':
  267.             n = res_mkquery(QUERY, cp, C_IN, T_ANY, NULL, 0,
  268.                     NULL, packet, sizeof packet);
  269.             break;
  270.  
  271. #ifdef ALLOW_UPDATES
  272.         case '^':
  273.             {
  274.                 char IType[10], TempStr[50];
  275.                 int Type, oldnbytes, nbytes, i;
  276. #ifdef ALLOW_T_UNSPEC
  277.                 printf("Data type (a = T_A, u = T_UNSPEC): ");
  278.                 gets(IType);
  279.                 if (IType[0] == 'u') {
  280.                     Type = T_UNSPEC;
  281.                     printf("How many data bytes? ");
  282.                     gets(TempStr); /* Throw away CR */
  283.                     sscanf(TempStr, "%d", &nbytes);
  284.                     for (i = 0; i < nbytes; i++) {
  285.                         (NewRR.r_data)[i] = (char) i;
  286.                     }
  287.                 } else {
  288. #endif /* ALLOW_T_UNSPEC */
  289.                     Type = T_A;
  290.                     nbytes = INT32SZ;
  291.                     printf(
  292.                   "Inet addr for new dname (e.g., 192.4.3.2): "
  293.                        );
  294.                     gets(TempStr);
  295.                     putlong(ntohl(inet_addr(TempStr)),
  296.                     NewRR.r_data);
  297. #ifdef ALLOW_T_UNSPEC
  298.                 }
  299. #endif
  300.                 NewRR.r_class = C_IN;
  301.                 NewRR.r_type = Type;
  302.                 NewRR.r_size = nbytes;
  303.                 NewRR.r_ttl = 99999999;
  304.                 printf("Add, modify, or modify all (a/m/M)? ");
  305.                 gets(TempStr);
  306.                 if (TempStr[0] == 'a') {
  307.                     n = res_mkquery(UPDATEA, cp, C_IN, Type,
  308.                             OldRRData, nbytes,
  309.                             &NewRR, packet,
  310.                             sizeof packet);
  311.                 } else {
  312.                     if (TempStr[0] == 'm') {
  313.                         printf("How many data bytes in old RR? ");
  314.                         gets(TempStr); /* Throw away CR */
  315.                         sscanf(TempStr, "%d", &oldnbytes);
  316.                     for (i = 0; i < oldnbytes; i++) {
  317.                         OldRRData[i] = (char) i;
  318.                     }
  319.                     n = res_mkquery(UPDATEM, cp,
  320.                             C_IN, Type,
  321.                             OldRRData, oldnbytes,
  322.                             &NewRR, packet,
  323.                             sizeof packet);
  324.                 } else { /* Modify all */
  325.                     n = res_mkquery(UPDATEMA, cp,
  326.                             C_IN, Type, NULL, 0,
  327.                             &NewRR, packet,
  328.                             sizeof packet);
  329.  
  330.                 }
  331.                 }
  332.             }
  333.             break;
  334.  
  335. #ifdef ALLOW_T_UNSPEC
  336.         case 'D':
  337.             n = res_mkquery(UPDATEDA, cp, C_IN, T_UNSPEC,
  338.                     (char *)0, 0, NULL,
  339.                     packet, sizeof packet);
  340.             break;
  341.  
  342.         case 'd':
  343.             {
  344.                 char TempStr[100];
  345.                 int nbytes, i;
  346.                 printf("How many data bytes in oldrr data? ");
  347.                 gets(TempStr); /* Throw away CR */
  348.                 sscanf(TempStr, "%d", &nbytes);
  349.                 for (i = 0; i < nbytes; i++) {
  350.                     OldRRData[i] = (char) i;
  351.                 }
  352.                 n = res_mkquery(UPDATED, cp, C_IN, T_UNSPEC,
  353.                         OldRRData, nbytes, NULL,
  354.                         packet, sizeof packet);
  355.             }
  356.             break;
  357. #endif /* ALLOW_T_UNSPEC */
  358. #endif /* ALLOW_UPDATES */
  359.  
  360.         default:
  361.             printf("a{host} - query  T_A\n");
  362.             printf("A{addr} - iquery T_A\n");
  363.             printf("b{user} - query  T_MB\n");
  364.             printf("B{user} - query  T_MG\n");
  365.             printf("f{host} - query  T_UINFO\n");
  366.             printf("g{host} - query  T_GID\n");
  367.             printf("G{gid}  - iquery T_GID\n");
  368.             printf("h{host} - query  T_HINFO\n");
  369.             printf("i{host} - query  T_MINFO\n");
  370.             printf("p{host} - query  T_PTR\n");
  371.             printf("m{host} - query  T_MX\n");
  372.             printf("M{host} - query  T_MAILB\n");
  373.             printf("n{host} - query  T_NS\n");
  374.             printf("r{host} - query  T_MR\n");
  375.             printf("s{host} - query  T_SOA\n");
  376.             printf("T{host} - query  T_TXT\n");
  377.             printf("u{host} - query  T_UID\n");
  378.             printf("U{uid}  - iquery T_UID\n");
  379.             printf("x{host} - query  T_AXFR\n");
  380.             printf("w{host} - query  T_WKS\n");
  381.             printf("F{host} - query  T_AFSDB\n");
  382.             printf("c{host} - query  T_CNAME\n");
  383.             printf("*{host} - query  T_ANY\n");
  384. #ifdef ALLOW_UPDATES
  385.             printf("^{host} - add/mod/moda    (T_A/T_UNSPEC)\n");
  386. #ifdef ALLOW_T_UNSPEC
  387.             printf("D{host} - deletea T_UNSPEC\n");
  388.             printf("d{host} - delete T_UNSPEC\n");
  389. #endif /* ALLOW_T_UNSPEC */
  390. #endif /* ALLOW_UPDATES */
  391.             continue;
  392.         }
  393.         if (n < 0) {
  394.             printf("res_mkquery: buffer too small\n");
  395.             continue;
  396.         }
  397.         if (log) {
  398.             fprintf(log,"SEND QUERY\n");
  399.             fp_query(packet, log);
  400.         }
  401.         n = res_send(packet, n, answer, sizeof(answer));
  402.         if (n < 0) {
  403.             printf("res_send: send error\n");
  404.             if (log) fprintf(log, "res_send: send error\n");
  405.         }
  406.         else {
  407.             if (dump_packet) {
  408.                 int f;
  409.                 f = creat("ns_packet.dump", 0644);
  410.                 write(f, answer, n);
  411.                 (void) close(f);
  412.             }
  413.             if (log) {
  414.                 fprintf(log, "GOT ANSWER\n");
  415.                 fp_query(answer, log);
  416.             }
  417.         }
  418.     }
  419. }
  420.  
  421. usage()
  422. {
  423.     fprintf(stderr, "Usage: %s [-v] [-i] [-r] [-d] [-p port] hostaddr\n",
  424.         progname);
  425.     exit(1);
  426. }
  427.